home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / amiga / convrtrs / iff2icon.lha / IFF2Icon / IFF2Icon.asm < prev    next >
Encoding:
Assembly Source File  |  1993-09-02  |  19.6 KB  |  870 lines

  1. DEBUGBOOL    =    0    (set to TRUE, if ya wanna DebugMode!)
  2.  
  3. ;;    *****************************************************************
  4.     *    Programm:    IFF2Icon                *
  5.     *            (erzeugt Icon- aus IFF-File)        *
  6.     *    Copyright:    Freeware ⌐ von Hanns Holger Rutz/Tro-    *
  7.     *            picDesign                *
  8.     *    History:    19.-30.04.1993    diese erste Version    *
  9.     *            07.08.1993    removed a little bug    *
  10.     *            31.08.1993    removed BODY-Read Bug    *
  11.     *    Bugs:        PutDiskObject() keeps sum KiloBytes of    *
  12.     *            memory, I don't know why...        *
  13.     *            IFF-Loader: DEST-Chunk,Mask?        *
  14.     *****************************************************************
  15.  
  16. ;;-- Includes --
  17.  
  18.         incdir    'sys:asm/inc/'
  19.         include    'dos/dosextens.i'
  20.         include    'exec/memory.i'
  21.         include    'intuition/intuition.i'
  22.         include    'private/dos_lib.i'
  23.         include    'private/icon_lib.i'
  24.         include    'private/macros.i'
  25.         include    'workbench/workbench.i'
  26.  
  27. ;;-- Macros --
  28.  
  29. version        macro
  30.         dc.b    '1.0b'
  31.         endm
  32.  
  33. ;;-- Konstanten --
  34.  
  35.         rsreset            ;nowhere defined in da includes...
  36. bmhd_W        rs.w    1        Bildbreite
  37. bmhd_H        rs.w    1        Bildh÷he
  38. bmhd_X        rs.w    1
  39. bmhd_Y        rs.w    1
  40. bmhd_Depth    rs.b    1        Tiefe
  41. bmhd_Mask    rs.b    1
  42. bmhd_Pack    rs.b    1        1 if ByteRunOne, 0 if none
  43. bmhd_PAD    rs.b    1
  44. bmhd_TColor    rs.w    1
  45. bmhd_XAspect    rs.b    1
  46. bmhd_YAspect    rs.b    1
  47. bmhd_PicW    rs.w    1
  48. bmhd_PicH    rs.w    1
  49. bmhd_SIZEOF    rs.b    0
  50.  
  51.         rsreset
  52. gl_DOSBase    rs.l    1
  53. gl_IconBase    rs.l    1
  54. gl_RDArgs    rs.l    1
  55. gl_Return    rs.b    1
  56.         rsword
  57. gl_Result2    rs.l    1
  58. gl_Process    rs.l    1
  59.  
  60. gl_Array     rs.b    0    \
  61. gl_aFrom    rs.l    1     \
  62. gl_aTo        rs.l    1      \
  63. gl_aDisk    rs.l    1       \
  64. gl_aDrawer    rs.l    1        \
  65. gl_aTool    rs.l    1         \
  66. gl_aProject    rs.l    1         /
  67. gl_aGarbage    rs.l    1        /
  68. gl_aComplement    rs.l    1       /
  69. gl_aBackFill    rs.l    1      /
  70. gl_aImage    rs.l    1     /
  71. gl_aPAD        rs.l    2    /
  72.  
  73. gl_RealName    rs.b    512+4        Name des IconFiles ohne evtl. '.info'
  74. gl_DiskObject    rs.l    1        Icon-Struktur, die geschrieben wird
  75.         rs.l    1        gl_FileInfo mu▀t be LONG-aligned :-(
  76. gl_FileInfo    rs.b    fib_SIZEOF    intern (fⁿr _GetType)
  77. gl_IconType    rs.b    1        WBDISK, WBTOOL etc.
  78.         rsword
  79. gl_VecList     rs.b    0
  80. gl_BMHD        rs.l    1    \    *AllocVec-Speicher fⁿr BMHD-Chunk
  81. gl_BODY        rs.l    1     \    *AllocVec-Speicher fⁿr BODY-Chunk
  82. gl_Image1    rs.l    1     /    *AllocVec-ImageStruktur         <-\
  83. gl_Image2    rs.l    1    /    *ImageStruktur (selected) AllocVec /
  84. VecNum        =    3
  85.  
  86. gl_SIZEOF    rs.b    0
  87.  
  88. ;;-- StartUp --
  89.  
  90. _Start        move.w    #gl_SIZEOF/2-1,d0
  91. .ClearLoop    clr.w    -(sp)
  92.         dbf    d0,.ClearLoop
  93.         movea.l    sp,gl
  94.         exec    a0
  95.         movea.l    ThisTask(a0),gl_Process(gl)
  96.         move.b    #RETURN_FAIL,gl_Return(gl)
  97.  
  98.         bsr.b    _OpenLibs
  99.         beq.b    _CleanUp
  100.         if DEBUGBOOL
  101.             *move.b    #WBTOOL,gl_IconType(gl)
  102.             moveq.l    #-1,d0
  103.             move.l    d0,gl_aImage(gl)
  104.             lea.l    .From(pc),a0
  105.             move.l    a0,gl_aFrom(gl)
  106.             lea.l    .To(pc),a0
  107.             move.l    a0,gl_aTo(gl)
  108.             lea.l    gl_RealName(gl),a1
  109. .Loop            move.b    (a0)+,(a1)+
  110.             bne.b    .Loop
  111.             bra.b    _Main
  112. .From            dc.b    'sys:Graphik/IFF/AADMagIcon.Hi4',0
  113. .To            dc.b    'ram:t',0
  114.             even
  115.         else
  116.             bsr.w    _GetArgs
  117.             beq.b    _CleanUp
  118.         endc
  119.  
  120. ;;-- Hauptprogramm --
  121.  
  122. _Main        bsr.w    _GetIcon
  123.         beq.b    .PrintError
  124.         bsr.w    _PutIcon
  125.         beq.b    .PrintError
  126.         clr.b    gl_Return(gl)
  127.         bra.b    .MainEnd
  128.  
  129. .PrintError    slib    DOS
  130.         move.l    gl_Result2(gl),d1
  131.         moveq.l    #0,d2
  132.         fjsr    PrintFault        DOS-Fehlerbeschreibung ausgeben
  133. .MainEnd
  134.  
  135. ;;-- AufrΣumen --
  136.  
  137. _CleanUp    bsr.w    _Free        DiskObject-Struktur etc. freigeben
  138.         bsr.w    _FreeArgs
  139.         bsr.w    _CloseLibs
  140.         moveq.l    #0,d0
  141.         move.b    gl_Return(gl),d0
  142.         beq.b    .Exit
  143.         movea.l    gl_Process(gl),a0
  144.         move.l    gl_Result2(gl),pr_Result2(a0)
  145. .Exit        lea.l    gl_SIZEOF(sp),sp
  146.         rts
  147.  
  148. ;;-- globaler Konstantenspeicher --
  149.  
  150.         dc.b    '$VER: IFF2Icon',$A0
  151.         version
  152.         dc.b    0
  153.         even
  154.  
  155. ;;-- Libraries ÷ffnen --
  156. ;    Out:    cc=eq, wenn Fehler
  157.  
  158. _OpenLibs    push    d0/d1/a0/a1
  159.  
  160.         exec
  161.         lea.l    .DOSName(pc),a1
  162.         moveq.l    #36,d0
  163.         fjsr    OpenLibrary
  164.         move.l    d0,gl_DOSBase(gl)
  165.         beq.b    .DOSError
  166.         lea.l    .IconName(pc),a1
  167.         moveq.l    #36,d0
  168.         fjsr    OpenLibrary
  169.         move.l    d0,gl_IconBase(gl)
  170.         beq.b    .IconError
  171.  
  172. .Exit        pull    d0/d1/a0/a1
  173.         rts
  174.  
  175. .DOSError
  176. .Error        moveq.l    #ERROR_INVALID_RESIDENT_LIBRARY,d0
  177.         move.l    d0,gl_Result2(gl)
  178.         clr.b    d0                cc=eq
  179.         bra.b    .Exit
  180.  
  181. .IconError    slib    DOS
  182.         lea.l    .ErrorTxt(pc),a0
  183.         move.l    a0,d1
  184.         lea.l    .IconName(pc),a0
  185.         move.l    a0,-(sp)
  186.         move.l    sp,d2            'icon.library' = Argument
  187.         fjsr    VPrintf
  188.         addq.l    #4,sp
  189.         bra.b    .Error
  190.  
  191. .DOSName    DOSNAME
  192. .IconName    ICONNAME
  193. .ErrorTxt    dc.b    "%s v36+ couldn't be opened!",$0a,0
  194.         even
  195.  
  196. ;;-- Libraries schlie▀en --
  197.  
  198. _CloseLibs    push    d0/d1/a0/a1
  199.  
  200.         exec
  201.         movea.l    gl_IconBase(gl),a1        Basis oder NULL
  202.         fjsr    CloseLibrary
  203.         movea.l    gl_DOSBase(gl),a1        Basis oder NULL
  204.         fjsr    CloseLibrary
  205.  
  206.         pull    d0/d1/a0/a1
  207.         rts
  208.  
  209. ;;-- Shell-Argumente lesen/auswerten --
  210. ;    Out:    cc=eq, wenn Fehler
  211.  
  212. _GetArgs    push    d0/d1/a0-a2/lb
  213.  
  214.         slib    DOS
  215.         lea.l    .Template(pc),a0
  216.         move.l    a0,d1
  217.         lea.l    gl_Array(gl),a0
  218.         move.l    a0,d2
  219.         moveq.l    #0,d3
  220.         fjsr    ReadArgs            Argmente einlesen
  221.         move.l    d0,gl_RDArgs(gl)
  222.         beq.b    .Error
  223.  
  224.         lea.l    gl_aGarbage+4(gl),a0
  225.         moveq.l    #WBGARBAGE,d0
  226. .TypeLoop    tst.l    -(a0)
  227.         bne.b    .TypeEnd
  228.         subq.b    #1,d0                IconType berechnen
  229.         bgt.b    .TypeLoop
  230.         tst.l    gl_aTo(gl)
  231.         beq.b    .TypeError       ..weder IconFile noch Typ angegeben
  232. .TypeEnd    move.b    d0,gl_IconType(gl)
  233.  
  234.         move.l    gl_aTo(gl),d0
  235.         beq.b    .OkExit
  236.         movea.l    d0,a0
  237.         lea.l    gl_RealName(gl),a1
  238.         move.l    a1,-(sp)
  239. .NameLoop    move.b    (a0)+,(a1)+        IconNamen kopieren
  240.         bne.b    .NameLoop
  241.         subq.l    #6,a1
  242.         cmpa.l    (sp)+,a1
  243.         blt.b    .NameEnd        ..weniger als 5 Buchstaben
  244.         movea.l    a1,a0            a0 = *Eventuelles.InfoSuffix
  245.         cmpi.b    #'.',(a1)+
  246.         bne.b    .NameEnd        ..kein '.' fⁿr '.info'
  247.         move.l    #'ofni',d0
  248. .NameLoop2    move.b    (a1)+,d1
  249.         bset.l    #5,d1            LowerCase
  250.         cmp.b    d1,d0
  251.         bne.b    .NameEnd        ..kein .info-Suffix
  252.         lsr.l    #8,d0
  253.         bne.b    .NameLoop2
  254.         clr.b    (a0)            .info-Suffix entfernen
  255. .NameEnd
  256. .OkExit        moveq.l    #-1,d0            cc=ne
  257.  
  258. .Exit        pull    d0/d1/a0-a2/lb
  259.         rts
  260.  
  261. ;In: lb = *DOSBase
  262.  
  263. .Error        bsr.w    _GetIOErr
  264. .PrintUsage    lea.l    -108(sp),sp
  265.         move.l    sp,d1
  266.         moveq.l    #108,d2
  267.         fjsr    GetProgramName        Programm-Namen holen und
  268.         lea.l    .Usage(pc),a0
  269.         move.l    a0,d1
  270.         move.l    sp,d2
  271.         fjsr    VPrintf            ..zusammen mit Usage ausgeben
  272.         lea.l    108(sp),sp
  273.         clr.b    d0            cc=eq
  274.         bra.b    .Exit
  275.  
  276. .TypeError    moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  277.         move.l    d0,gl_Result2(gl)
  278.         bra.b    .PrintUsage
  279.  
  280. .Template    dc.b    'FROM,TO/K,DISK/S,DRAWER/S,TOOL/S,PROJECT/S,GARBAGE/S,'
  281.         dc.b    'COMPLEMENT/S,BACKFILL/S,IMAGE/S',0
  282. .Usage        dc.b    'Usage:  IFF2Icon [<IFFFile>] [To <IconFile>] [<IconTy'
  283.         dc.b    'pe>] [<HighlightType>]',$0a,$0a
  284.         dc.b    '  IconType:       Disk|Drawer|Tool|Project|Garbage'
  285.         dc.b    $0a
  286.         dc.b    '  HightlightType: Complement|BackFill|Image',$0a,$0a
  287.         dc.b    '  Specify <IconFile> and/or <IconType>!',$0a,0
  288.         even
  289.  
  290. ;;-- RDArgs zurⁿckgeben --
  291.  
  292. _FreeArgs    push    d0/d1/a0/a1/lb
  293.  
  294.         slib    DOS
  295.         move.l    gl_RDArgs(gl),d1
  296.         beq.b    .Exit
  297.         fjsr    FreeArgs
  298.  
  299. .Exit        pull    d0/d1/a0/a1/lb
  300.         rts
  301.  
  302. ;;-- IOError sichern --
  303. ;    Out:    d0.l = IOError, cc=d0.l
  304.  
  305. _GetIOErr    lpush    a0
  306.  
  307.         movea.l    gl_Process(gl),a0
  308.         move.l    pr_Result2(a0),d0        IOError in d0
  309.         move.l    d0,gl_Result2(gl)        ..und sichern (cc)
  310.  
  311.         lpull    a0
  312.         rts
  313.  
  314. ;;-- IFFFile / DefaultIcon lesen --
  315. ;    Out:    cc=eq, wenn Fehler
  316.  
  317. _GetIcon    push    d0-d2/a0/a1/lb
  318.  
  319.         slib    Icon
  320.         tst.l    gl_aTo(gl)
  321.         beq.b    .TypeEnd
  322.         bsr.w    _GetType        Typ anhand des Files ermitteln
  323.         bne.b    .TypeCont        ..kein Fehler
  324.         move.b    gl_IconType(gl),d1    ..Fehler, wichtig?
  325.         beq.w    .TypeErr        ..ja
  326.         cmpi.b    #WBTOOL,d1
  327.         beq.b    .TypeCont        ..nein
  328.         cmpi.b    #WBPROJECT,d1
  329.         bne.w    .TypeErr        ..ja
  330. .TypeCont    tst.b    gl_IconType(gl)
  331.         bne.b    .TypeEnd
  332.         move.b    d0,gl_IconType(gl)
  333. .TypeEnd
  334.         tst.l    gl_aFrom(gl)
  335.         beq.w    .GetDefault        ..DefaultIcon laden (kein From)
  336.  
  337. .Get        bsr.w    _GetIFF            IFF-Graphik einlesen
  338.         beq.w    .Exit            ..Fehler
  339.         suba.l    a0,a0
  340.         fjsr    GetDiskObject        leere DiskObjectStruktur
  341.         move.l    d0,gl_DiskObject(gl)    ..besorgen
  342.         beq.w    .GetErr
  343.         movea.l    d0,a0
  344.         move.l    #WB_DISKMAGIC<<16!WB_DISKVERSION,(a0)    ..und fⁿllen
  345.         move.b    gl_IconType(gl),do_Type(a0)
  346.         move.l    #NO_ICON_POSITION,d0
  347.         move.l    d0,do_CurrentX(a0)
  348.         move.l    d0,do_CurrentY(a0)
  349.         cmpi.b    #WBTOOL,gl_IconType(gl)
  350.         beq.b    .GetCont3            ..kein Window
  351.         cmpi.b    #WBPROJECT,gl_IconType(gl)
  352.         beq.b    .GetCont3            ..kein Window
  353.         lea.l    .DrawerData(pc),a1
  354.         move.l    a1,do_DrawerData(a0)        Windowdaten einfⁿgen
  355. .GetCont3
  356.         move.l    #4096,do_StackSize(a0)
  357.         movea.l    gl_Image1(gl),a1
  358.         move.l    ig_Width(a1),do_Gadget+gg_Width(a0)
  359.         move.b    #WB_DISKREVISION,do_Gadget+gg_UserData+3(a0)
  360.         move.l    a1,do_Gadget+gg_GadgetRender(a0)
  361.         moveq.l    #GADGIMAGE!GADGHCOMP,d0        Highlight: Complement
  362.         tst.l    gl_aBackFill(gl)
  363.         beq.b    .GetCont
  364.         moveq.l    #GADGIMAGE!GADGHBOX,d0        Highlight: BackFill
  365. .GetCont    tst.l    gl_aImage(gl)
  366.         beq.b    .GetCont2
  367.         moveq.l    #GADGIMAGE!GADGHIMAGE,d0    Highlight: Image
  368.         move.l    gl_Image2(gl),do_Gadget+gg_SelectRender(A0)
  369. .GetCont2    move.w    d0,do_Gadget+gg_Flags(a0)
  370.         *moveq.l #-1,d0
  371.         bra.b    .Exit
  372.  
  373. .GetDefault    moveq.l    #0,d0
  374.         move.b    gl_IconType(gl),d0
  375.         fjsr    GetDefDiskObject        DefaultIcon holen
  376.         move.l    d0,gl_DiskObject(gl)
  377.         beq.b    .GetDefErr            ..Fehler
  378.  
  379. .Exit        pull    d0-d2/a0/a1/lb
  380.         rts
  381.  
  382. .GetErr        bsr.w    _GetIOErr
  383.         lea.l    .GetErrTxt(pc),a0
  384.         bra.b    .PrintError
  385.  
  386. .GetDefErr    bsr.w    _GetIOErr
  387.         lea.l    .DefErrTxt(pc),a0
  388.         ;||
  389. ;    In:    a0 = *Text
  390.  
  391. .PrintError    move.l    a0,d1
  392.         slib    DOS
  393.         fjsr    PutStr                Fehler ausgeben
  394.         bra.b    .ErrorExit
  395.  
  396. .TypeErr    lea.l    .TypeErrTxt(pc),a0
  397.         move.l    a0,d1
  398.         lea.l    gl_RealName(gl),a0        From-Namen zusammen mit
  399.         move.l    a0,-(sp)
  400.         move.l    sp,d2
  401.         slib    DOS
  402.         fjsr    VPrintf                ..Fehlertext ausgeben
  403.         addq.l    #4,sp
  404. .ErrorExit    clr.b    d0                cc=eq
  405.         bra.b    .Exit
  406.  
  407. .DrawerData    dc.w    50,50,400,100
  408.         dc.b    -1,-1
  409.         dc.l    0
  410. .f1        =    WFLG_SIZEGADGET!WFLG_DRAGBAR!WFLG_DEPTHGADGET
  411. .f2        =    WFLG_CLOSEGADGET!WFLG_SIZEBRIGHT!WFLG_SIZEBBOTTOM
  412. .f3        =    WFLG_SIMPLE_REFRESH!WFLG_REPORTMOUSE!WFLG_WBENCHWINDOW
  413.         dc.l    .f1!.f2!.f3
  414.         dc.l    0,0,0,0,0
  415.         dc.w    90,40,-1,-1,WBENCHSCREEN
  416.         dc.l    0,0
  417.         dc.l    0
  418.         dc.w    0
  419.  
  420. .TypeErrTxt    dc.b    "Couldn't get information on '%s'!",$0a,0
  421. .DefErrTxt    dc.b    "Couldn't get the default Icon!",$0a,0
  422. .GetErrTxt    dc.b    "Unable to create Icon!",$0a,0
  423.         even
  424.  
  425. ;;-- (Default-)Icon schreiben --
  426. ;    Out:    cc=eq, wenn Fehler
  427.  
  428. _PutIcon    push    d0/d1/a0/a1/lb
  429.  
  430.         slib    Icon
  431.         tst.l    gl_aTo(gl)
  432.         beq.b    .PutDefault        ..DefaultIcon erzeugen
  433.  
  434. .Put        lea.l    gl_RealName(gl),a0
  435.         movea.l    gl_DiskObject(gl),a1
  436.         fjsr    PutDiskObject        Icon erzeugen
  437.         tst.l    d0
  438.         beq.b    .PutErr            ..Fehler
  439.         bra.b    .Exit
  440.  
  441. .PutDefault    movea.l    gl_DiskObject(gl),a0
  442.         fjsr    PutDefDiskObject    DefaultIcon erzeugen
  443.         tst.l    d0
  444.         beq.b    .PutDefErr        ..Fehler
  445.  
  446. .Exit        pull    d0/d1/a0/a1/lb
  447.         rts
  448.  
  449. .PutDefErr    bsr.w    _GetIOErr
  450.         lea.l    .DefErrTxt(pc),a0
  451.         move.l    a0,d1
  452.         slib    DOS
  453.         fjsr    PutStr                Fehlertext ausgeben
  454.         clr.b    d0                cc=eq
  455.         bra.b    .Exit
  456.  
  457. .PutErr        bsr.w    _GetIOErr
  458.         lea.l    gl_RealName(gl),a0        To-Namen zusammen mit
  459.         move.l    a0,-(sp)
  460.         lea.l    .ErrTxt(pc),a0
  461.         move.l    a0,d1
  462.         move.l    sp,d2
  463.         slib    DOS
  464.         fjsr    VPrintf                ..Fehlertext ausgeben
  465.         addq.l    #4,sp
  466.         clr.b    d0                cc=eq
  467.         bra.b    .Exit
  468.  
  469. .DefErrTxt    dc.b    "Couldn't create default Icon!",$0a,0
  470. .ErrTxt        dc.b    "Couldn't create Icon for '%s'!",$0a,0
  471.         even
  472.  
  473. ;;-- DiskObject-Struktur etc. freigeben --
  474.  
  475. _Free        push    d0-d2/a0-a2/lb
  476.  
  477.         movea.l    gl_DiskObject(gl),d0
  478.         beq.b    .ObjectEnd
  479.         slib    Icon
  480.         movea.l    d0,a0
  481.         fjsr    FreeDiskObject        DiskObject freigeben,
  482.                         ;bei nicht-default werden die
  483.                         ;Images nicht freigeben
  484. .ObjectEnd
  485.         lea.l    gl_VecList(gl),a2
  486.         moveq.l    #VecNum-1,d2
  487.         exec
  488. .VecLoop    movea.l    (a2)+,a1
  489.         fjsr    FreeVec        BMHD, BODY, Images etc. freigeben
  490.         dbf    d2,.VecLoop
  491.  
  492.         pull    d0-d2/a0-a2/lb
  493.         rts
  494.  
  495. ;;-- Filetypen ermitteln und gl_RealName ggf. Σndern --
  496. ;    Out:    d0.b = IconType, cc=eq, wenn Fehler
  497.  
  498. _GetType    push    d0-d4/a0-a3/lb
  499.  
  500.         lea.l    gl_RealName(gl),a3
  501.         move.l    a3,a0
  502. .Icon        slib    Icon
  503.         fjsr    GetDiskObject        Icon besorgen
  504.         tst.l    d0
  505.         beq.b    .File            ..keins gefunden
  506.         movea.l    d0,a0
  507.         move.b    do_Type(a0),3(sp)    Typ des alten Icons ⁿbernehmen
  508.         fjsr    FreeDiskObject
  509.         bra.w    .OkExit
  510.  
  511. .File        slib    DOS
  512.         move.l    a3,d1            *Name
  513.         moveq.l    #ACCESS_READ,d2
  514.         fjsr    Lock
  515.         move.l    d0,d4
  516.         beq.w    .Error            ..konnte nicht gelockt werden
  517.         move.l    d4,d1
  518.         lea.l    gl_FileInfo(gl),a2
  519.         move.l    a2,d2
  520.         andi.b    #~3,d2            LONG-align
  521.         movea.l    d2,a2            Fuck the DOS-Library!!!
  522.         fjsr    Examine
  523.         tst.w    d0
  524.         beq.w    .ErrorUnLock        ..konnte nicht examint werden
  525.         tst.l    fib_DirEntryType(a2)
  526.         blt.b    .CheckFile        ..eine Datei => die ⁿberprⁿfen
  527.  
  528. .Dir        move.l    d4,d1
  529.         lea.l    -512(sp),sp
  530.         move.l    sp,d2
  531.         move.l    #512,d3
  532.         fjsr    NameFromLock    vollen Namen ermitteln (ohne assigns)
  533.         movea.l    sp,a2
  534.         lea.l    512(sp),sp
  535.         tst.l    d0
  536.         beq.b    .ErrorUnLock        ..Fehler
  537.         move.l    d4,d1
  538.         fjsr    UnLock
  539. .DirLoop    move.b    (a2)+,(a3)+        Namen kopieren
  540.         bne.b    .DirLoop
  541.         moveq.l    #WBDRAWER,d0
  542.         move.l    d0,(sp)
  543.         subq.l    #2,a3
  544.         cmpi.b    #':',(a3)+
  545.         bne.b    .OkExit            ..Verzeichnis oder SoftLink
  546.  
  547. .Disk        moveq.l    #WBDISK,d0    
  548.         move.l    d0,(sp)            ..Boot-/Root-Directory (Disk)
  549.         move.l    #'ksid',d0
  550. .DiskLoop    move.b    d0,(a3)+        'disk' ranhΣngen
  551.         lsr.l    #8,d0
  552.         bne.b    .DiskLoop
  553.         clr.b    (a3)            String abschlie▀en
  554.         bra.b    .OkExit
  555.  
  556. .CheckFile    move.l    d4,d1
  557.         fjsr    OpenFromLock        Datei ÷ffnen
  558.         tst.l    d0
  559.         beq.b    .ErrorUnLock        ..Fehler
  560.         move.l    d0,d4
  561.         move.l    d4,d1
  562.         clr.l    -(sp)
  563.         move.l    sp,d2
  564.         moveq.l    #4,d3
  565.         fjsr    Read            4 Bytes zum Prⁿfen lesen
  566.         move.l    (sp)+,d2
  567.         cmp.l    d3,d0
  568.         blt.b    .ErrorClose        ..Fehler
  569.         move.l    d4,d1
  570.         fjsr    Close            Datei wieder schlie▀en
  571.         tst.w    d0
  572.         beq.b    .Error            ..Fehler
  573.         moveq.l    #WBTOOL,d0
  574.         move.l    d0,(sp)
  575.         cmpi.l    #$03F3,d2        ist die Datei ausfⁿhrbar?
  576.         beq.b    .OkExit            ..ja (Tool)
  577.         moveq.l    #WBPROJECT,d0
  578.         move.l    d0,(sp)            ..nein (Project)
  579.  
  580. .OkExit        moveq.l    #-1,d0
  581. .Exit        pull    d0-d4/a0-a3/lb
  582.         rts
  583.  
  584. ;die .Error-Routinene ben÷tigen lb = *DOSBase!
  585.  
  586. .ErrorClose    bsr.w    _GetIOErr
  587.         move.l    d4,d1
  588.         fjsr    Close
  589.         bra.b    .ErrorExit
  590.  
  591. .ErrorUnLock    bsr.w    _GetIOErr
  592.         move.l    d4,d1
  593.         fjsr    UnLock
  594.         bra.b    .ErrorExit
  595.  
  596. .Error        bsr.w    _GetIOErr
  597. .ErrorExit    clr.b    d0            cc=eq
  598.         bra.b    .Exit
  599.  
  600. ;;-- IFF-Graphik laden --
  601. ;    Out:    cc=eq, wenn Fehler
  602.  
  603. _GetIFF        push    d0-d6/a0-a2/lb
  604.  
  605.         lea.l    -12(sp),sp
  606.         moveq.l    #%11,d6            ;Bit0 cleared = BMHD read
  607.                         ;Bit1 cleared = BODY read
  608.         slib    DOS
  609.         move.l    gl_aFrom(gl),d1
  610.         move.l    #MODE_OLDFILE,d2
  611.         fjsr    Open            IFF-Datei ÷ffnen
  612.         move.l    d0,d4
  613.         beq.w    .OpenErr        ..Fehler
  614.         move.l    d4,d1
  615.         move.l    sp,d2
  616.         moveq.l    #12,d3
  617.         fjsr    Read            Header lesen
  618.         cmp.l    d3,d0
  619.         blt.w    .ILBMErr        ..Fehler
  620.         cmpi.l    #'FORM',(sp)
  621.         bne.w    .ILBMErr2        ..kein "FORM"
  622.         cmpi.l    #'ILBM',8(sp)
  623.         bne.w    .ILBMErr2        ..kein "ILBM"
  624.         move.l    4(sp),d5        LΣnge des Files -8
  625.         addq.l    #4,d5            ..fⁿr eigene Ansprⁿche Σndern
  626.  
  627. .ChunkLoop    tst.l    d6            n÷tige Chunx gelesen?
  628.         beq.w    .FileOk            ..ja
  629.         subq.l    #8,d5
  630.         ble.w    .MissErr        ..nein, aber Ende der Datei
  631.         move.l    d4,d1
  632.         move.l    sp,d2
  633.         moveq.l    #8,d3
  634.         fjsr    Read            Chunkheader lesen
  635.         cmp.l    d3,d0
  636.         blt.w    .ReadErr        ..Fehler
  637.         sub.l    4(sp),d5
  638.         btst.l    #0,d6            BMHD-Chunk schon gelesen?
  639.         beq.b    .ChunkCont        ..ja
  640.         cmpi.l    #'BMHD',(sp)
  641.         beq.b    .BMHD            ..nein, dies ist einer
  642. .ChunkCont
  643.         btst.l    #1,d6            BODY-Chunk schon gelesen?
  644.         beq.b    .ChunkCont2        ..ja
  645.         cmpi.l    #'BODY',(sp)
  646.         beq.b    .BODY            ..nein, dies ist einer
  647. .ChunkCont2
  648.         move.l    d4,d1
  649.         move.l    4(sp),d2
  650.         moveq.l    #OFFSET_CURRENT,d3
  651.         fjsr    Seek            zum nΣchsten Chunk
  652.         bsr.w    _GetIOErr
  653.         beq.b    .ChunkLoop
  654.         bra.w    .ReadErr        ..Fehler
  655.  
  656. .BMHD        exec
  657.         move.l    4(sp),d3
  658.         move.l    d3,d0
  659.         moveq.l    #MEMF_PUBLIC,d1
  660.         fjsr    AllocVec        Speicher besorgen
  661.         move.l    d0,gl_BMHD(gl)
  662.         slib    DOS
  663.         beq.w    .MemErr            ..Fehler
  664.         move.l    d0,d2
  665.         move.l    d4,d1
  666.         fjsr    Read            Daten einlesen
  667.         bclr.l    #0,d6
  668.         cmp.l    d3,d0
  669.         beq.b    .ChunkLoop
  670.         bra.w    .ReadErr        ..Fehler
  671.  
  672. .BODY        exec
  673.         move.l    4(sp),d3
  674.     addq.l    #1,d3
  675.     bclr.l    #0,d3
  676.         move.l    d3,d0
  677.         moveq.l    #MEMF_PUBLIC,d1
  678.         fjsr    AllocVec        Speicher besorgen
  679.         move.l    d0,gl_BODY(gl)
  680.         slib    DOS
  681.         beq.w    .MemErr            ..Fehler
  682.         move.l    d0,d2
  683.         move.l    d4,d1
  684.         fjsr    Read            Daten einlesen
  685.         bclr.l    #1,d6
  686.         cmp.l    d3,d0
  687.         beq.w    .ChunkLoop
  688.         bra.w    .ReadErr        ..Fehler
  689.  
  690. .FileOk        move.l    d4,d1
  691.         fjsr    Close            Fertig, Datei schlie▀en
  692.         tst.w    d0
  693.         beq.w    .CloseErr        ..Fehler
  694.         exec
  695.         move.l    gl_BMHD(gl),a2
  696.         cmpi.b    #1,bmhd_Pack(a2)    PackTyp bekannt (ByteRun1)?
  697.         bgt.w    .PackErr        ..nein
  698.         move.w    bmhd_W(a2),d0
  699.         addi.w    #15,d0
  700.         lsr.w    #4,d0
  701.         add.w    d0,d0
  702.         moveq.l    #0,d1
  703.         move.b    bmhd_Depth(a2),d1
  704.         mulu.w    d1,d0
  705.         mulu.w    bmhd_H(a2),d0        d0.l = PictureSize
  706.         moveq.l    #ig_SIZEOF,d1        ..+Image-Structure-Size
  707.         tst.l    gl_aImage(gl)
  708.         beq.b    .ImageCont
  709.         add.b    d1,d1        ..nochmal, da es zwei Images sind
  710. .ImageCont    add.l    d1,d0
  711.         move.l    #MEMF_PUBLIC!MEMF_CLEAR,d1
  712.         move.l    d0,-(sp)
  713.         fjsr    AllocVec            Speicher besorgen
  714.         move.l    (sp)+,d1
  715.         move.l    d0,gl_Image1(gl)
  716.         beq.w    .MemErr2            ..Fehler
  717.         tst.l    gl_aImage(gl)
  718.         beq.b    .ImageCont2
  719.         lsr.l    #1,d1
  720.         add.l    d1,d0
  721.         move.l    d0,gl_Image2(gl)        ggf. 2. ImageAdresse
  722.         lsr.w    #1,bmhd_H(a2)        jedes Image hat eine vertikale
  723.                         ;HΣlfte
  724. .ImageCont2
  725.         movea.l    gl_Image1(gl),a0
  726.         movea.l    gl_BODY(gl),a1
  727.         bsr.w    .CreateImage            1. Image berechnen
  728.         tst.l    gl_aImage(gl)
  729.         beq.b    .ImageCont3
  730.         movea.l    gl_Image2(gl),a0
  731.         movea.l    d0,a1
  732.         bsr.w    .CreateImage            ggf. 2. Image auch
  733. .ImageCont3
  734.         movea.l    a2,a1
  735.         clr.l    gl_BMHD(gl)
  736.         fjsr    FreeVec                BMHD freigeben
  737.         movea.l    gl_BODY(gl),a1
  738.         clr.l    gl_BODY(gl)
  739.         fjsr    FreeVec                BODY freigeben
  740.         moveq.l    #-1,d0
  741.  
  742. .Exit        lea.l    12(sp),sp
  743.         pull    d0-d6/a0-a2/lb
  744.         rts
  745.  
  746. ;-- alle Error-Routinen au▀er .MemErr2 ben÷tigen lb = *DOSBase! --
  747.  
  748. .ILBMErr    bsr.w    _GetIOErr
  749.         bne.b    .ILBMCont            ..DOS-Fehler
  750. .ILBMErr2    move.l    #ERROR_OBJECT_WRONG_TYPE,gl_Result2(gl)
  751. .ILBMCont    lea.l    .ILBMTxt(pc),a2
  752.         ;||
  753. ;    In:    a2 = *ErrorText, the routine closes da file
  754.  
  755. .PrintError    move.l    d4,d1
  756.         fjsr    Close                Datei schlie▀en
  757. .PrintError2    move.l    a2,d1
  758.         lea.l    gl_aFrom(gl),a0
  759.         move.l    a0,d2
  760.         fjsr    VPrintf                ..und Text ausgeben
  761. .ErrorExit    clr.b    d0                cc=eq
  762.         bra.b    .Exit
  763.  
  764. .MissErr    moveq.l    #ERROR_REQUIRED_ARG_MISSING,d0
  765.         move.l    d0,gl_Result2(gl)
  766.         lea.l    .MissTxt(pc),a2
  767.         bra.b    .PrintError
  768.  
  769. .CloseErr
  770. .OpenErr    bsr.w    _GetIOErr
  771.         lea.l    .InfoTxt(pc),a2
  772.         bra.b    .PrintError2
  773.  
  774. .ReadErr    bsr.w    _GetIOErr
  775.         lea.l    .ReadTxt(pc),a2
  776.         bra.b    .PrintError
  777.  
  778. .MemErr        moveq.l    #ERROR_NO_FREE_STORE,d0
  779.         move.l    d0,gl_Result2(gl)
  780.         lea.l    .InfoTxt(pc),a2
  781.         bra.b    .PrintError
  782.  
  783. .MemErr2    moveq.l    #ERROR_NO_FREE_STORE,d0
  784.         move.l    d0,gl_Result2(gl)
  785.         lea.l    .MemTxt(pc),a0
  786.         move.l    a0,d1
  787.         slib    DOS
  788.         fjsr    PutStr                Text ausgeben
  789.         bra.b    .ErrorExit
  790.  
  791. .PackErr    move.l    #ERROR_NOT_IMPLEMENTED,gl_Result2(gl)
  792.         lea.l    .PackTxt(pc),a2
  793.         bra.b    .PrintError2
  794.  
  795. ;-- Image-Struktur ausfⁿllen --
  796. ;    In:    a0 = *ImageStruct (hinten dran Speicher fⁿr die Graphik)
  797. ;        a1 = *CurrentBODYAddress, a2 = *BMHD-Address
  798. ;    Out:    d0 = *NewBODYAddress
  799. ;    ACHTUNG: wenn gl_aImage ~= 0: bmhd_H durch 2 teilen!
  800. ;         bmhd_Pack mu▀ 0 oder 1 sein!
  801.  
  802. .CreateImage    push    d1-d7/a0-a3
  803.  
  804.         lea.l    ig_SIZEOF(a0),a3
  805.         move.l    a3,ig_ImageData(a0)
  806.         move.w    #$ff00,ig_PlanePick(a0)
  807.         move.b    bmhd_Depth(a2),ig_Depth+1(a0)
  808.         move.l    bmhd_W(a2),ig_Width(a0)
  809.  
  810.         move.w    bmhd_W(a2),d4
  811.         addi.w    #15,d4
  812.         lsr.w    #4,d4
  813.         add.w    d4,d4            d4.w = LineSize
  814.         move.w    bmhd_H(a2),d2        d2.w = LineNumba
  815.         move.w    ig_Depth(a0),d7
  816.         mulu.w    d2,d7
  817.         subq.w    #1,d7
  818.         mulu.w    d4,d7            d7.l = PlaneSize*Depth-LineSize
  819.         subq.w    #1,d2            d2.w = LineNumba-1
  820.         move.w    d2,d6
  821.         mulu.w    d4,d6            d6.l = PlaneSize-LineSize
  822.  
  823. .LineLoop    moveq.l    #0,d3
  824.         move.b    bmhd_Depth(a2),d3
  825.         subq.b    #1,d3
  826. .DepthLoop    move.w    d4,d5
  827. .InLineLoop    moveq.l    #0,d0
  828.         tst.b    bmhd_Pack(a2)        Bild gepackt?
  829.         beq.b    .UnPacked        ..nein
  830.         move.b    (a1)+,d0        ..ja, ein Byte lesen
  831.         blt.b    .Crunch            ..ByteRun: gecruncht
  832.  
  833. .NoCrunch    sub.w    d0,d5            ⁿbrige Bytes/Zeile korrigieren
  834. .NCLoop        move.b    (a1)+,(a3)+        ungecrunchte Bytes kopieren
  835.         dbf    d0,.NCLoop
  836.         bra.b    .Cont
  837.  
  838. .Crunch        neg.b    d0
  839.         sub.w    d0,d5            ⁿbrige Bytes/Zeile korrigieren
  840.         move.b    (a1)+,d1
  841. .CLoop        move.b    d1,(a3)+        gepackte Bytes kopieren
  842.         dbf    d0,.CLoop
  843. .Cont
  844.         subq.w    #1,d5            Control-Byte abziehen
  845.         bgt.b    .InLineLoop        ..Zeile noch nicht zu Ende
  846. .DepthEnd    add.l    d6,a3            nΣchste Bitplane
  847.         dbf    d3,.DepthLoop
  848.         sub.l    d7,a3            wieder zur 1. Bitplane, aber
  849.                         ;jetzt die nΣchste Zeile
  850.         dbf    d2,.LineLoop
  851.  
  852.         move.l    a1,d0            Returncode = *NeuerBODY
  853.         pull    d1-d7/a0-a3
  854.         rts
  855.  
  856. .UnPacked    subq.w    #1,d5
  857. .UPLoop        move.b    (a1)+,(a3)+        Graphik direkt kopieren
  858.         dbf    d5,.UPLoop
  859.         bra.b    .DepthEnd        nΣchste Line der nΣchsten Plane
  860.  
  861. ;IF BIT7 SET, CRUNCH=ON  -> NUMBER =-BYTE+1    <= ByteRun1-Algorithmus
  862. ;       ELSE, CRUNCH=OFF -> NUMBER = BYTE+1
  863.  
  864. .ILBMTxt    dc.b    "'%s': No IFF (FORM/ILBM) File!",$0a,0
  865. .InfoTxt    dc.b    "Couldn't get information on '%s'!",$0a,0
  866. .ReadTxt    dc.b    "'%s': Error while reading!",$0a,0
  867. .MissTxt    dc.b    "'%s': BMHD- or BODY-Chunk missing!",$0a,0
  868. .MemTxt        dc.b    "Can't create Icon-Images!",$0a,0
  869. .PackTxt    dc.b    "'%s': Unknown pack-method!",$0a,0
  870.